#ifndef XMLDOCUMENT_H
#define XMLDOCUMENT_H

#include "XML_global.h"

#include "Element.h"
#include "Node.h"
#include "TextNode.h"

#include <string>
#include <sstream>
#include <fstream>

using namespace std;

namespace xml{

/*! @brief La classe XMLDocument sert à lire et écrire un document XML  */
class XMLSHARED_EXPORT Document :  Node{

    /*******************************************
     *              Public
     *******************************************/
    public:

        /*******************************************
         *              Constructors
         *******************************************/

            Document();
            Document(ifstream & file);
            Document(string     filepath);

        /*******************************************
         *              Methods
         *******************************************/

            /*! @brief Retourne une liste d'élément XML corespondant au tagname passé en paramètre  */
            vector<Element *>   GetElementsByTagName(string tagName);

            bool LoadXML(string filePath);

            bool Save(const char * filePath);
            void Save(ofstream & f);

            void Print();   /*!< @brief Affiche le contenu de chaque noeud dans la console  */


        /*******************************************
         *              Properties
         *******************************************/

            bool    Error;


    /*******************************************
     *              Private
     *******************************************/

        /*******************************************
         *              Methods
         *******************************************/

            bool        LoadFile(ifstream &f);
            void        LoadElement();
            void        LoadAttributes();
            void        LoadAttribute();
            void        LoadContent();

            void        SkipFirstLine(ifstream & file);
            void        LoadRootElement(ifstream & file);
            void        WriteDefinition(ofstream * f);

            Element *   LoadTag(ifstream &f);

        /*******************************************
         *              Properties
         *******************************************/

            Element *    m_Root;
};
}

#endif // XMLDOCUMENT_H
